/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ejb;

import com.entidades.Campanha;
import com.entidades.Cliente;

import com.entidades.dao.DaoBasico;
import com.entidades.enumerandos.OperadorasEnum;
import com.entidades.enumerandos.PlanoClienteEnum;
import com.entidades.enumerandos.ProvedorEnum;
import com.entidades.enumerandos.StatusCampanhaEnum;

import excecoes.SaldoInsuficienteException;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;

/**
 *
 * @author Ricardo
 */
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class GerenciadorCampanhaBean implements GerenciadorCampanhaRemote, GerenciadorCampanhaLocal {

    @Resource
    private UserTransaction utx;
    @PersistenceContext
    private EntityManager em;
    private Campanha campanha;

    /**
     * método para fins de teste, não agenda, apenas envia.
     */
    /**
     * metodo para salvar a campanha
     * @param campanha
     */
    public void NovaCampanha(Campanha campanha) throws SaldoInsuficienteException {

        this.campanha = campanha;

        campanha.setStatus(StatusCampanhaEnum.NOVA);
        campanha.setDataHoraSolicitacao(new Date());
        campanha.setDataHoraAgendamento(new Date());
        campanha.setQuantidaTentativas(0);

        if (campanha.getProvedor() == null) {
            campanha.setProvedor(ProvedorEnum.GSM);
        }
        if(campanha.getOperadora() ==null){
            campanha.setOperadora(OperadorasEnum.OI);
        }

        verificaCliente(campanha.getUsuario().getCliente(), campanha.getNumeroMensagem());

        DaoBasico.persist(campanha, em, utx);
/*
        for (Destinatario d : campanha.getListaDestinatarios()) {
            DaoBasico.persist(d, em, utx);
            

            Pacote p = new Pacote();
            p.setNumero(d.getNumero());
            p.setStatus(StatusPacoteEnum.NOVO);
            p.setMensagem(campanha.getMensagem());
            p.setDestinatario(d);

            DaoBasico.persist(p, em, utx);
        }*/
    }

    private void verificaCliente(Cliente cliente, int numeroMensagem) throws SaldoInsuficienteException {
        if (PlanoClienteEnum.PRE_PAGO.equals(cliente.getPlano())) {
            if (!possuiSaldoSuficiente(cliente.getSaldoSms(), numeroMensagem)) {
                this.campanha.setStatus(StatusCampanhaEnum.REPROVADA);
                throw new SaldoInsuficienteException();
            } else {
                campanha.setStatus(StatusCampanhaEnum.APROVADA);
            }
        }
        if (PlanoClienteEnum.POS_PAGO.equals(cliente.getPlano())) {
            campanha.setStatus(StatusCampanhaEnum.APROVADA);
        }
    }

    private boolean possuiSaldoSuficiente(int saldo, int numeroMensagem) {
        if (saldo < numeroMensagem) {
            return false;
        }
        return true;
    }
}
